package Queue;

import java.util.Arrays;

public class MyArrayQueue {
    //定义数组存储队列中的元素
    private Object[] arr = new Object[8];
    private int front;//队首
    private int rear;//队尾
    private int size;//元素的个数

    //入队 - 添加元素 offer
    public void offer(Object obj){
        //如果队列已满 ,则对数组扩容
        if (size >= arr.length){
            //定义一个更大的数组,默认按2倍大小扩容
            Object[] newArr = new Object[arr.length * 2];
            /*把原来数组的内容复制到新的数组中,
                从队首开始的元素依次复制到新数组下标为0的位置
              建议不要使用Java中的方法实现数组复制.
             */
            for (int i = 0; i < size; i++) {
                newArr[i] = arr[front];
                front = (front + 1) % arr.length;
            }
            //让原来的数组名指向新的数组
            arr = newArr;
            //调整新的队首也队尾指针
            front = 0 ;
            rear = size;
        }
        //将元素添加到数组中
        arr[rear] = obj;
        rear = (rear + 1) % arr.length;
        size++;
    }

    //判断是否要进行扩容
    //队列的数组进行扩容
    private void expandQueue() {
        //定义一个更大的数组,默认按2倍大小扩容
        Object[] newArr = new Object[arr.length * 2];
            /*把原来数组的内容复制到新的数组中,
                从队首开始的元素依次复制到新数组下标为0的位置
              建议不要使用Java中的方法实现数组复制.
             */
        for (int i = 0; i < size; i++) {
            newArr[i] = arr[front];
            front = (front + 1) % arr.length;
        }
        //让原来的数组名指向新的数组
        arr = newArr;
        //调整新的队首也队尾指针
        front = 0 ;
        rear = size;
    }

    //出队 - 不删除元素 peek
    public Object peek(){
        //队列为空,则直接返回
        if (size <= 0 ){
            return null;
        }
        return arr[front];
    }

    //出队 - 删除元素 poll
    public Object poll(){
        //如果队列为空
        if ( size <= 0 ) {
            return null;
        }
        //队列不为空, 把front指向的元素返回,
        Object old = arr[front];
        //front指针后移
        front = (front + 1 ) % arr.length;
        size--;
        return old;
    }

    @Override
    public String toString() {
        return Arrays.toString(arr);
    }
}
